home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / mxcode / gsrc211 / modload.asm < prev    next >
Assembly Source File  |  1994-03-14  |  8KB  |  337 lines

  1. Header:
  2. songname        db      20 dup (?)
  3. samples         db      31*size SampleRec dup (?)
  4. songlen         db      ?
  5. restart         db      ?
  6. sequences       db      128 dup (?)
  7. mk              dd      ?
  8. HeaderSize       =      $-Header
  9.  
  10. SigCopy         db      'PS16■'
  11. PS16Header:
  12. Sig        db    'PS16■'
  13. SongName    db    75 dup (0)
  14. SongLen     db    0
  15. numpatterns    db    0
  16. commentofs    dd    0
  17. Sequences    db    128 dup (0)
  18. Samples     db    31*size PS16Sample dup (0)
  19. PS16Size    =    $-PS16Header
  20.  
  21. PatternLoc      dw      64 dup (0)
  22. InsLoc          dd      32 dup (0)
  23. Handle          dw      0
  24. proc            MUS_LoadModule near
  25.                 pusha
  26.                 push    ds es
  27.                 mov     ds,cx
  28.                 mov     ax,3D00h
  29.                 int     21h
  30.                 jb      @@Exit
  31.                 mov     [cs:Handle],ax
  32.                 mov     ax,cs
  33.                 mov     ds,ax
  34.                 mov     es,ax
  35.                 call    MUS_ReadMod
  36.                 mov     ax,3E00h
  37.                 mov     bx,[cs:Handle]
  38.                 int     21h
  39. @@Exit:         pop     es ds
  40.                 popa
  41.                 ret
  42. endp            MUS_LoadModule
  43.  
  44. proc        MUS_ConvertHeader
  45.         ; Clear Header
  46.         pusha
  47.         push    ds
  48.         mov    ax,cs
  49.         mov    ds,ax
  50.         mov    es,ax
  51.         mov    di,offset PS16Header
  52.         mov    al,0
  53.         mov    cx,PS16Size
  54.         rep    stosb
  55.  
  56.         mov    si,offset SigCopy
  57.         mov    di,offset Sig
  58.         mov    cx,5
  59.                 rep     movsb
  60.                 mov     si,offset songname
  61.         mov    di,offset SongName
  62.         mov    cx,20
  63.         rep    movsb
  64.         mov    al,26
  65.         stosb
  66.         mov    al,[songlen]
  67.         mov    [SongLen],al
  68.         mov    si,offset sequences
  69.         mov    di,offset Sequences
  70.         mov    cx,128
  71.         rep    movsb
  72.  
  73.         mov    bp,31
  74.         mov    si,offset samples+(offset (SampleRec).length)
  75.         mov    di,offset Samples
  76. @@FlipLoop:    mov    ax,[si+4]
  77.         xchg    ah,al
  78.         mov    cx,ax
  79.         mov    bx,[si+6]
  80.         xchg    bh,bl
  81.         add    ax,bx
  82.         mov    dx,[si]
  83.         xchg    dh,dl
  84.         cmp    ax,dx
  85.         jbe    @@OKRepeat
  86.         shr    cx,1
  87. @@OKRepeat:    shl    dx,1
  88.         mov    [di+PS16Sample.length],dx
  89.         mov    ax,[si+2]
  90.         mov    [di+PS16Sample.volume],ax
  91.         shl    bx,1
  92.         mov    [di+PS16Sample.replen],bx
  93.         shl    cx,1
  94.         mov    [di+PS16Sample.repeat],cx
  95. @@OKSample:    add    si,size SampleRec
  96.         add    di,size PS16Sample
  97.         dec    bp
  98.         jne    @@FlipLoop
  99.         pop    ds
  100.         popa
  101.         ret
  102. endp            MUS_ConvertHeader
  103.  
  104. LocInList       dw      ?
  105. proc            MUS_ReadMod near
  106.                 push    ds
  107.                 mov     ax,3F00h                ; Read the header
  108.                 mov     bx,[cs:Handle]
  109.                 mov     dx,offset Header
  110.                 mov     cx,HeaderSize
  111.                 int     21h
  112.  
  113.                 cmp     [Word cs:mk],'.M'
  114.                 jnz     @@CheckFLT4
  115.                 cmp     [Word cs:mk+2],'.K'
  116.                 jz      @@31Ins
  117. @@CheckFLT4:    cmp     [Word cs:mk],'LF'
  118.                 jnz     @@15Ins
  119.         cmp    [Word cs:mk+2],'4T'
  120.                 jz      @@31Ins
  121. @@15Ins:        mov     si,offset Header+20+15*30
  122.                 mov     di,offset songlen
  123.                 mov     cx,134
  124.                 rep     movsb
  125.                 mov     di,offset Header+20+15*30
  126.                 mov     cx,16*30
  127.                 mov     al,0
  128.                 rep     stosb
  129.                 mov     ax,4200h
  130.                 mov     bx,[cs:Handle]
  131.                 mov     cx,0
  132.                 mov     dx,258h
  133.                 int     21h
  134.  
  135. @@31Ins:    call    MUS_ConvertHeader
  136.         call    MUS_LoadPatterns
  137.                 mov     cx,31
  138.                 mov     bx,offset samples+(offset (SampleRec).length)
  139. @@FlipLoop:
  140.                 mov     dx,[cs:bx]      ; Flip length
  141.                 xchg    dh,dl
  142.                 shl     dx,1
  143.                 mov     [cs:bx],dx
  144.                 mov     ax,[cs:bx+6]    ; Flip repeat length
  145.                 xchg    ah,al
  146.                 shl     ax,1
  147.                 mov     [cs:bx+6],ax
  148.                 mov     ax,[cs:bx+4]    ; Flip repeat
  149.                 xchg    ah,al
  150.                 shl     ax,1
  151.                 mov     [cs:bx+4],ax
  152. @@OKSample:     add     bx,size SampleRec
  153.                 loop    @@FlipLoop
  154.  
  155.                 mov     cx,31
  156.                 mov     bx,offset samples+(offset (SampleRec).length)
  157.                 mov     [Word cs:LocInList],0
  158.                 mov     si,0            ; Location in DRAM to begin
  159.         mov    di,0
  160. @@DoSamples:    push    cx
  161.                 mov     ax,[cs:bx]
  162.                 or      ax,ax
  163.                 jz      @@ZeroByteSample
  164.                 mov     cx,ax           ; Save for read from disk.
  165.                 push    bx
  166.                 mov     bx,[cs:LocInList]
  167.                 mov     [Word cs:bx+InsLoc],di
  168.                 mov     [Word cs:bx+InsLoc+2],si
  169.                 add     [Word cs:LocInList],4
  170.                 mov     ax,[cs:Handle]
  171.         mov    dx,[cs:TopOfData]
  172.         mov    bx,0Dh
  173.                 call    [dword ptr cs:Music]
  174.                 pop     bx
  175.                 jmp     @@Bottom
  176. @@ZeroByteSample:
  177.                 push    bx
  178.                 mov     bx,[cs:LocInList]
  179.                 mov     [Word cs:bx+InsLoc],0
  180.                 mov     [Word cs:bx+InsLoc+2],0f000h
  181.                 add     [Word cs:LocInList],4
  182.                 pop     bx
  183. @@Bottom:       add     bx,size SampleRec
  184.                 pop     cx
  185.                 loop    @@DoSamples
  186. @@Skip:     
  187.         pop    ds
  188.                 ret
  189. endp            MUS_ReadMod
  190.  
  191. proc            MUS_GetHighestBlock near
  192.                 mov     si,offset sequences
  193.                 mov     cx,128
  194.                 xor     ax,ax
  195. @@SetBlock:     mov     ah,al
  196.                 jmp     @@BotLoop
  197. @@SearchLoop:   lodsb
  198.                 cmp     al,ah
  199.                 jg      @@SetBlock
  200. @@BotLoop:      loop    @@SearchLoop
  201.                 mov     al,ah
  202.                 inc     al
  203.                 xor     ah,ah                   ; Clear ah.
  204.                 ret
  205. endp            MUS_GetHighestBlock
  206.  
  207. MUS_Match    dw    1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,912
  208.         dw    856,808,762,720,678,640,604,570,538,508,480,453
  209.         dw    428,404,381,360,339,320,302,285,269,254,240,226
  210.         dw    214,202,190,180,170,160,151,143,135,127,120,113
  211.         dw    107,101,95,90,85,80,75,71,67,63,60,56,0
  212. proc            MUS_LoadMatcher
  213.                 mov     ax,[si]
  214.                 xchg    ah,al
  215.                 and     ax,0FFFh
  216.         or    ax,ax
  217.         jz    @@Done
  218.                 mov     bx,offset MUS_Match
  219.         mov    cx,0
  220. @@NoteMatcher:  cmp     ax,[cs:bx]
  221.         jae    @@Found
  222.         add    bx,2
  223.         inc    cx
  224.         cmp    cx,61
  225.         jnz    @@NoteMatcher
  226.         mov    ax,0
  227.         ret
  228. @@Found:    mov    ax,cx
  229.         inc    ax
  230. @@Done:         ret
  231. endp        MUS_LoadMatcher
  232.  
  233. PatSeg          dw      0
  234. Buf4        dw    0
  235. proc            MUS_LoadPatterns near
  236.                 mov     cx,64
  237.                 mov     di,offset PatternLoc
  238.                 xor     ax,ax
  239.                 rep     stosw
  240.  
  241.                 call    MUS_GetHighestBlock
  242.         mov    [cs:numpatterns],al
  243.         mov    ax,[cs:TopOfData]
  244.         sub    ax,4096/16
  245.         mov    [cs:PatSeg],ax
  246.         add    ax,1024/16
  247.         mov    [cs:Buf4],ax
  248.         mov    es,ax
  249.  
  250.         mov    si,offset PatternLoc
  251.         mov    cx,0
  252. @@BlockReadLoop:
  253.         push    cx si
  254.         mov    cx,1024
  255.                 mov     bx,[cs:Handle]
  256.         mov    ax,[cs:PatSeg]
  257.         mov    ds,ax
  258.         xor    dx,dx
  259.                 mov     ax,3F00h                ; Load in the block.
  260.                 int     21h
  261.         mov    cx,0            ; Channels
  262.         mov    di,0
  263.         mov    ax,[cs:Buf4]
  264.                 mov     es,ax
  265.                 mov     ax,0
  266.         stosw
  267.         mov    al,64
  268.         stosb
  269. @@ChannelLoop:  push    cx
  270.         mov    si,0
  271.         shl    cx,2
  272.         add    si,cx
  273.         mov    cx,0
  274. @@LineLoop:    push    cx
  275.         cmp    [Word si],0
  276.         jnz    @@ItsThere
  277.         cmp    [Word si+2],0
  278.         jz    @@NothingSkip
  279. @@ItsThere:    mov    al,cl
  280.         stosb
  281.         call    MUS_LoadMatcher
  282.         mov    bl,[si]
  283.         and    bl,0F0h
  284.         shl    bl,2
  285.         or    al,bl
  286.         stosb
  287.         mov    ax,[si+2]
  288.         stosw
  289. @@NothingSkip:    pop    cx
  290.         add    si,16
  291.         inc    cx
  292.         cmp    cx,64
  293.         jnz    @@LineLoop
  294.         mov    al,-1
  295.         stosb
  296.         pop    cx
  297.         inc    cx
  298.         cmp    cx,4
  299.         jnz    @@ChannelLoop
  300.         mov    cx,4
  301. @@CLoop:    mov    al,-1
  302.         stosb
  303.         inc    cx
  304.         cmp    cx,16
  305.         jnz    @@CLoop
  306.         mov    bx,di
  307.         mov    di,0
  308.         mov    cx,bx
  309.         mov    ax,bx
  310.                 stosw
  311.         shr    bx,4
  312.         inc    bx
  313.         pop    si
  314.         push    si
  315.         mov    ax,[cs:TopOfData]
  316.         mov    [cs:si],ax
  317.         add    [Word cs:TopOfData],bx
  318.         push    ds
  319.         mov    ax,es
  320.         mov    ds,ax
  321.         mov    ax,[cs:si]
  322.         mov    es,ax
  323.         mov    di,0
  324.         mov    si,0
  325.         rep    movsb
  326.         pop    ds
  327.         pop    si cx
  328.         add    si,2
  329.         inc    cx
  330.         cmp    cl,[cs:numpatterns]
  331.         jnz    @@BlockReadLoop
  332.                 clc
  333.                 ret
  334. endp            MUS_LoadPatterns
  335.  
  336.  
  337.